home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Chans / lists / hack.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.7 KB  |  259 lines

  1. /* hack.c - taken from quipu/dish/fred.c */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/lists/RCS/hack.c,v 6.0 1991/12/18 20:10:43 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/lists/RCS/hack.c,v 6.0 1991/12/18 20:10:43 jpo Rel $
  9.  *
  10.  * $Log: hack.c,v $
  11.  * Revision 6.0  1991/12/18  20:10:43  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. /*
  17.  *                  NOTICE
  18.  *
  19.  *    Acquisition, use, and distribution of this module and related
  20.  *    materials are subject to the restrictions of a license agreement.
  21.  *    Consult the Preface in the User's Manual for the full terms of
  22.  *    this agreement.
  23.  *
  24.  */
  25.  
  26.  
  27. #include <ctype.h>
  28. #include <stdio.h>
  29. #include <isode/quipu/ds_search.h>
  30. #include <isode/quipu/list.h>
  31. #include <isode/quipu/read.h>
  32. #include <isode/quipu/entry.h>
  33. #include <isode/quipu/ufn.h>
  34. #include <isode/quipu/dua.h>
  35. #include <isode/tailor.h>
  36.  
  37. #if ISODE < 69
  38. #define s_filter filter
  39. #endif
  40.  
  41. struct dn_seq *dl_interact ();
  42.  
  43. Filter    joinfilter (), ocfilter ();
  44.  
  45. struct dn_seq *dn_seq_push ();
  46.  
  47. /*     DM2DN SUPPORT */
  48.  
  49. static    int    dlevel = 0;
  50. static    int    dsa_status;
  51.  
  52. struct dn_seq *dm2dn_seq ();
  53. struct dn_seq *dm2dn_seq_aux ();
  54. Filter    make_filter ();
  55.  
  56. /*   */
  57.  
  58. DN str2ufn_here (ufn,dn)
  59. char * ufn;
  60. DN dn;
  61. {
  62. struct ds_search_arg search_arg;
  63. static struct ds_search_result result;
  64. struct DSError err;
  65. static CommonArgs ca = default_common_args;
  66. Filter filtcn, filtoc, filtand, filtor, filtuid, strfilter();
  67.  
  68.     filtcn = strfilter (AttrT_new("cn"),ufn,FILTERITEM_APPROX);
  69.     filtuid = strfilter (AttrT_new("uid"),ufn,FILTERITEM_EQUALITY);
  70.     filtoc = ocfilter ("person");
  71.  
  72.     filtuid->flt_next = filtcn;
  73.     filtor = joinfilter (filtuid, FILTER_OR);
  74.  
  75.     filtoc->flt_next = filtor;
  76.     filtand = joinfilter (filtoc,FILTER_AND);
  77.  
  78.     search_arg.sra_baseobject = dn;
  79.     search_arg.sra_filter = filtand;
  80.     search_arg.sra_subset = SRA_ONELEVEL;
  81.     search_arg.sra_searchaliases = FALSE;
  82.     search_arg.sra_common = ca; /* struct copy */
  83.     search_arg.sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
  84.     search_arg.sra_eis.eis_allattributes = FALSE;
  85.     search_arg.sra_eis.eis_select = NULLATTR;
  86.  
  87.     if (ds_search (&search_arg, &err, &result) != DS_OK) {
  88.         filter_free (filtoc);
  89.         log_ds_error (&err);
  90.         ds_error_free (&err);
  91.         return NULLDN;
  92.     }
  93.     filter_free (filtoc);
  94.  
  95.     if (result.CSR_entries) {
  96.         if (result.CSR_entries->ent_next)
  97.             /* could ask user to select here - leave that for UCL */
  98.             return NULLDN;
  99.         return result.CSR_entries->ent_dn ;
  100.     }
  101.  
  102.     return NULLDN;
  103.     
  104. }
  105.  
  106. DN    do_dm_match (vec)
  107. char  *vec;
  108. {
  109.     int        seqno;
  110.     char   *cp,
  111.         mbox[BUFSIZ]; 
  112.     register struct dn_seq *dlist,
  113.                *dp;
  114.     DN dn;
  115.     extern char * local_dit;
  116.     DN localdn;
  117.     
  118.     localdn = str2dn (local_dit);
  119.  
  120.     if ((cp = index (vec, '@')) && cp != vec) {
  121.     *cp++ = NULL;
  122.     (void) strcpy (mbox, vec);
  123.     if (*cp == NULL) 
  124.         return NULLDN; 
  125.     }
  126.     else
  127.         return str2ufn_here(vec,localdn);
  128.  
  129.     if ((dlist = dm2dn_seq (cp)) == NULLDNSEQ) {
  130. /*
  131.         ps_printf (OPT, "Unable to resolve domain.\n");
  132. */
  133.     return NULLDN;
  134.     }
  135.  
  136.     if ((! dlist) || dlist->dns_next)
  137.         NULLDN;
  138.  
  139.     if ((dn = str2ufn_here(mbox,dlist->dns_dn)) != NULLDN)
  140.         return dn;
  141.  
  142.    return NULLDN;
  143. }
  144.  
  145. /*   */
  146.  
  147. static struct dn_seq *dm2dn_seq (dm)
  148. char   *dm;
  149. {
  150.     register char *dp;
  151.  
  152.     for (dp = dm; *dp; dp++)
  153.     if (isupper (*dp))
  154.         *dp = tolower (*dp);
  155.  
  156.     dlevel = 0;
  157.     dsa_status = OK;
  158.  
  159.     return dm2dn_seq_aux (dm, NULLDN, NULLDNSEQ);
  160. }
  161.  
  162. /*   */
  163.  
  164. static struct dn_seq *dm2dn_seq_aux (dm, dn, dlist)
  165. char   *dm;
  166. DN    dn;
  167. struct dn_seq *dlist;
  168. {
  169.     register char   *dp;
  170.     struct ds_search_arg search_arg;
  171.     register struct ds_search_arg *sa = &search_arg;
  172.     struct ds_search_result search_result;
  173.     register struct ds_search_result *sr = &search_result;
  174.     struct DSError error;
  175.     register struct DSError *se = &error;
  176.  
  177.     bzero ((char *) sa, sizeof *sa);
  178.  
  179.     sa -> sra_common.ca_servicecontrol.svc_options = SVC_OPT_PREFERCHAIN;
  180.     sa -> sra_common.ca_servicecontrol.svc_timelimit = SVC_NOTIMELIMIT;
  181.     sa -> sra_common.ca_servicecontrol.svc_sizelimit = SVC_NOSIZELIMIT;
  182.  
  183.     sa -> sra_baseobject = dn;
  184.     sa -> sra_subset = SRA_ONELEVEL;
  185.     sa -> sra_searchaliases = FALSE;
  186.  
  187.     sa -> sra_eis.eis_allattributes = FALSE;
  188.     sa -> sra_eis.eis_select = NULLATTR;
  189.     sa -> sra_eis.eis_infotypes = EIS_ATTRIBUTESANDVALUES;
  190.  
  191.     dp = dm;
  192.     for (;;) {
  193.     int        i;
  194.     EntryInfo  *ptr;
  195.     register struct s_filter *fi;
  196.  
  197.     if ((i = strlen (dp)) < dlevel)
  198.         break;
  199.  
  200.     sa -> sra_filter = fi = filter_alloc ();
  201.  
  202.     bzero ((char *) fi, sizeof *fi);
  203.     fi -> flt_type = FILTER_ITEM;
  204.     fi -> FUITEM.fi_type = FILTERITEM_EQUALITY;
  205.     if ((fi -> FUITEM.UNAVA.ava_type = AttrT_new ("associateddomain")) == NULL)
  206.         fatal (-100, "associatedDomain: invalid attribute type");
  207.     fi -> FUITEM.UNAVA.ava_value = str2AttrV (dp, str2syntax("IA5string"));
  208.  
  209.     if (ds_search (sa, se, sr) != DS_OK) 
  210.         goto free_filter;
  211.  
  212.     if (sr -> srr_correlated != TRUE)
  213.         correlate_search_results (sr);
  214.  
  215.     if (sr -> CSR_entries == NULLENTRYINFO) {
  216.         filter_free (sa -> sra_filter);
  217.         if (dp = index (dp, '.'))
  218.         dp++;
  219.         if (dp == NULL)
  220.         break;
  221.         continue;
  222.     }
  223.  
  224.     for (ptr = sr -> CSR_entries; ptr; ptr = ptr -> ent_next)
  225.         cache_entry (ptr, sa -> sra_eis.eis_allattributes,
  226.              sa -> sra_eis.eis_infotypes);
  227.  
  228.     if (i > dlevel) {
  229.         dlevel = i;
  230.         if (dlist)
  231.         dn_seq_free (dlist), dlist = NULLDNSEQ;
  232.     }
  233.  
  234.     if (i == dlevel)
  235.         for (ptr = sr -> CSR_entries; ptr; ptr = ptr -> ent_next) {
  236.         struct dn_seq *dprev = dlist;
  237.  
  238.         dlist = dm2dn_seq_aux (dm, ptr -> ent_dn, dlist);
  239.  
  240.         if (dprev == dlist)
  241.             dlist = dn_seq_push (ptr -> ent_dn, dlist);
  242.         else
  243.             if (i < dlevel)
  244.             break;
  245.         }
  246.  
  247.     dn_free (sr -> CSR_object);
  248.     entryinfo_free (sr -> CSR_entries, 0);
  249.     crefs_free (sr -> CSR_cr);
  250.  
  251. free_filter: ;
  252.     filter_free (sa -> sra_filter);
  253.     break;
  254.     }
  255.  
  256.     return dlist;
  257. }
  258.  
  259.